#include "stm32f10x_rcc.h"
#include "stm32f10x_gpio.h"
#include "keyboard.h"

void keyboard_init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    GPIO_InitTypeDef GPIO_InitStruct =
    {
        .GPIO_Speed = GPIO_Speed_50MHz
    };

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
    GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

    GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;
    GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_Init(GPIOA, &GPIO_InitStruct);
}

int keyboard_get_key(void)
{
    static int key_pressing[4][4];
    static int keys[16];
    static int keys_cnt = 0;
    while (!keys_cnt)
    {
        for (int i = 0; i < 4; i++)
        {
            GPIO_ResetBits(GPIOA, 1 << i);
            for (int i = 0; i < 1000; i++);
            for (int j = 0; j < 4; j++)
            {
                int input = GPIO_ReadInputDataBit(GPIOA, 1 << (j + 4));
                if (!input)
                {
                    if (!key_pressing[i][j])
                    {
                        key_pressing[i][j] = 1;
                        keys[keys_cnt++] = i * 4 + j;
                    }
                }
                else
                {
                    if (key_pressing[i][j])
                    {
                        key_pressing[i][j] = 0;
                    }
                }
            }
            GPIO_SetBits(GPIOA, 1 << i);
        }
    }
    return keys[--keys_cnt];
}
